package com.atguigu.day07

import java.util.Properties

import org.apache.spark.sql.{SaveMode, SparkSession}
import org.junit.Test

class $08_WriteFile {

  val spark = SparkSession.builder().master("local[4]").appName("test").getOrCreate()

  /**
    * 保存数据的两种方式:
    *     1、df.write
    *         .mode() --指定数据的写入模式
    *         .format()  --指定数据保存格式
    *         .option()
    *         .save()/save(path)
    *     2、df.write.mode().csv()/json()/parquet()
    *
    * 写入模式:
    *     SaveMode.Overwrite: 如果数据存储目录/表已经存在则覆盖<数据写入HDFS时使用>
    *     SaveMode.Append:  如果数据存储目录/表已经存在则覆盖,则追加数据<数据写入mysql时使用>
    */
  @Test
  def writeFile(): Unit ={

    val df = spark.read.option("header","true").csv("datas/presidential_polls.csv")
    //写成csv
    df.write.mode(SaveMode.Overwrite).option("header","true").csv("output/csv")
    //写成文本 [保存的时候如果dataFrame有多列不能保存成文本]
    //df.write.text("output/text")

    //写成parquet
    df.write.mode(SaveMode.Overwrite).parquet("output/parquet")


    val props = new Properties()
    props.setProperty("user","root")
    props.setProperty("password","root123")
    //此种形式写入mysql的时候,如果主键已经存在则会报错,此时需要通过foreachPartition写代码插入数据<在插入的时候判断如果主键存在则更新如果不存在则插入>
    //
    df.write.mode(SaveMode.Append).jdbc("jdbc:mysql://hadoop102:3306/test","presidential_polls",props)
  }
}
